package Z07JDBC.Z08JDBCpool;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 李某
 * * @date 2021/10/21
 * *物有本末，事有终始。知其先后者，则近道矣！
 * *荷花开满池塘的前一天还是半塘荷花半塘云。
 */
public class TestBDPool {
/*
    ====传统的数据库连接===
    当有多个线程，每个线程都需要连接数据库执行SQL语句的话，
    那么每个线程都会创建一个连接，并且在使用完毕后，关闭连接。
    创建连接和关闭连接的过程也是比较消耗时间的，当多线程并发的时候，系统就会变得很卡顿。
    同时，一个数据库同时支持的连接总数也是有限的，如果多线程并发量很大，
    那么数据库连接的总数就会被消耗光，后续线程发起的数据库连接就会失败。


 */  // 数据库连接池
}

class ConnectionPool
{
    List<Connection> cs = new ArrayList<Connection>();
    int size;

        public ConnectionPool(int size) {
            this.size = size;
            init();
        }

        public void init() {

            //这里恰恰不能使用try-with-resource的方式，因为这些连接都需要是"活"的，不要被自动关闭了
            try {
                Class.forName("com.mysql.jdbc.Driver");
                for (int i = 0; i < size; i++) {
                    Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/" +
                                    "how2java?characterEncoding=UTF-8",
                            "root", "root");
                    cs.add(c);
                }
            } catch (SQLException | ClassNotFoundException e) {
                e.printStackTrace();
            }

        }
        public synchronized Connection getConnection() {
            while (cs.isEmpty()) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            Connection c = cs.remove(0);
            return c;
        }

        public synchronized void returnConnection(Connection c){
            cs.add(c);
            this.notifyAll();
        }


    }

